package com.iqiyi.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * TODO
 *Jwt的工具类:令牌的生成,令牌的合法性校验,以及令牌解析
 * @author qihangtao
 * @date 2021/1/7 0007 9:29
 */
public class JwtUtil {
    //过期时间25分钟
    static long ex = System.currentTimeMillis() + 25 * 60 * 1000;
    //秘钥
    static final String secret = "jwt_secret";
    /**
     * 令牌的生成
     * @param userId
     * @return
     */
    public static String jwtcreate(String userId){
        //从当前时间到25分钟后
        Date expire = new Date(ex);
        //生成一个jwt的构建器
        JWTCreator.Builder builder = JWT.create();
        //设置jwt令牌发送的对象(payload部分)
        builder.withAudience(userId);
        //设置令牌的过期时间点,25分钟后过期
        builder.withExpiresAt(expire);
        //设置令牌生成的加密算法
        Algorithm algorithm = Algorithm.HMAC256(secret);
        String token = builder.sign(algorithm);
        return token;
    }
    /**
     * 解析令牌,从令牌中获取用户的相关信息
     * @param token
     * @return
     */
    public static String getUserInfo(String token){
        //解密
        DecodedJWT decode = JWT.decode(token);
        String userId = decode.getAudience().get(0);
        return userId;
    }
    /**
     * 校验令牌的合法性
     * @param token
     * @return
     */
    public static Boolean checkToken(String token){
        //设置令牌生成的加密算法
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //使用与令牌生成相同的算法,构建一个验证令牌的校验器对象
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
        try{
            DecodedJWT verify = jwtVerifier.verify(token);
            if (verify!=null){
                return true;
            } else {
                return false;
            }
        }catch (Exception ex){
            return false;
        }
//        return false;
    }
}
